package annotation;

import java.lang.reflect.Method;

// 自定义注解（运行时保留）
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface LogAnnotation {
    String action();
    boolean needLog() default true;
}

// 使用注解的类
class UserService {
    @LogAnnotation(action = "用户登录", needLog = true)
    public void login(String username) {
        System.out.println(username + "登录系统");
    }

    @LogAnnotation(action = "用户退出")
    public void logout() {
        System.out.println("退出系统");
    }
}

// 注解解析器
public class AnnotationParsing {
    public static void main(String[] args) throws Exception {
        UserService service = new UserService();
        Class<?> cls = service.getClass();

        // 解析所有方法上的注解
        for (Method method : cls.getMethods()) {
            // 判断方法是否有LogAnnotation注解
            if (method.isAnnotationPresent(LogAnnotation.class)) {
                // 获取注解实例
                LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);

                // 读取注解属性
                System.out.println("操作：" + logAnnotation.action());
                System.out.println("需要日志：" + logAnnotation.needLog());

                // 执行方法（模拟业务逻辑）
                if (method.getName().equals("login")) {
                    method.invoke(service, "张三");
                } else {
                    method.invoke(service);
                }
                System.out.println("---");
            }
        }
    }
}
